package com.kexio.file.vo;

import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonFormat;

/**
 * 文件分享链接 - 视图对象
 * 
 * @author Kexio Team
 * @since 1.0.0
 * @description 用于接口返回脱敏/展示友好的字段
 */
public class ShareLinkVO {
    
    /** 分享链接ID */
    private String id;
    
    /** 文件ID */
    private String fileId;
    
    /** 文件名称（关联显示） */
    private String fileName;
    
    /** 分享码 */
    private String shareCode;
    
    /** 分享链接URL */
    private String shareUrl;
    
    /** 分享类型 */
    private Integer shareType;
    
    /** 分享类型文本 */
    private String shareTypeText;
    
    /** 分享状态 */
    private Integer status;
    
    /** 分享状态文本 */
    private String statusText;
    
    /** 访问权限 */
    private Integer accessPermission;
    
    /** 访问权限文本 */
    private String accessPermissionText;
    
    /** 最大访问次数 */
    private Integer maxAccessCount;
    
    /** 当前访问次数 */
    private Integer currentAccessCount;
    
    /** 最大下载次数 */
    private Integer maxDownloadCount;
    
    /** 当前下载次数 */
    private Integer currentDownloadCount;
    
    /** 分享有效期开始时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime validFrom;
    
    /** 分享有效期结束时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime validUntil;
    
    /** 分享创建者ID */
    private String creatorId;
    
    /** 分享创建者名称 */
    private String creatorName;
    
    /** 最后访问时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastAccessTime;
    
    /** 最后访问IP */
    private String lastAccessIp;
    
    /** 分享描述 */
    private String description;
    
    /** 是否有效 */
    private Boolean valid;
    
    /** 是否已过期 */
    private Boolean expired;
    
    /** 是否需要密码 */
    private Boolean requiresPassword;
    
    /** 是否为一次性链接 */
    private Boolean oneTimeLink;
    
    /** 是否可以下载 */
    private Boolean canDownload;
    
    /** 是否可以预览 */
    private Boolean canPreview;
    
    /** 是否还能访问 */
    private Boolean canAccess;
    
    /** 是否还能下载更多 */
    private Boolean canDownloadMore;
    
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
    // ==================== Getter/Setter ====================
    
    public String getId() { return this.id; }
    public void setId(String id) { this.id = id; }
    
    public String getFileId() { return this.fileId; }
    public void setFileId(String fileId) { this.fileId = fileId; }
    
    public String getFileName() { return this.fileName; }
    public void setFileName(String fileName) { this.fileName = fileName; }
    
    public String getShareCode() { return this.shareCode; }
    public void setShareCode(String shareCode) { this.shareCode = shareCode; }
    
    public String getShareUrl() { return this.shareUrl; }
    public void setShareUrl(String shareUrl) { this.shareUrl = shareUrl; }
    
    public Integer getShareType() { return this.shareType; }
    public void setShareType(Integer shareType) { this.shareType = shareType; }
    
    public String getShareTypeText() { return this.shareTypeText; }
    public void setShareTypeText(String shareTypeText) { this.shareTypeText = shareTypeText; }
    
    public Integer getStatus() { return this.status; }
    public void setStatus(Integer status) { this.status = status; }
    
    public String getStatusText() { return this.statusText; }
    public void setStatusText(String statusText) { this.statusText = statusText; }
    
    public Integer getAccessPermission() { return this.accessPermission; }
    public void setAccessPermission(Integer accessPermission) { this.accessPermission = accessPermission; }
    
    public String getAccessPermissionText() { return this.accessPermissionText; }
    public void setAccessPermissionText(String accessPermissionText) { this.accessPermissionText = accessPermissionText; }
    
    public Integer getMaxAccessCount() { return this.maxAccessCount; }
    public void setMaxAccessCount(Integer maxAccessCount) { this.maxAccessCount = maxAccessCount; }
    
    public Integer getCurrentAccessCount() { return this.currentAccessCount; }
    public void setCurrentAccessCount(Integer currentAccessCount) { this.currentAccessCount = currentAccessCount; }
    
    public Integer getMaxDownloadCount() { return this.maxDownloadCount; }
    public void setMaxDownloadCount(Integer maxDownloadCount) { this.maxDownloadCount = maxDownloadCount; }
    
    public Integer getCurrentDownloadCount() { return this.currentDownloadCount; }
    public void setCurrentDownloadCount(Integer currentDownloadCount) { this.currentDownloadCount = currentDownloadCount; }
    
    public LocalDateTime getValidFrom() { return this.validFrom; }
    public void setValidFrom(LocalDateTime validFrom) { this.validFrom = validFrom; }
    
    public LocalDateTime getValidUntil() { return this.validUntil; }
    public void setValidUntil(LocalDateTime validUntil) { this.validUntil = validUntil; }
    
    public String getCreatorId() { return this.creatorId; }
    public void setCreatorId(String creatorId) { this.creatorId = creatorId; }
    
    public String getCreatorName() { return this.creatorName; }
    public void setCreatorName(String creatorName) { this.creatorName = creatorName; }
    
    public LocalDateTime getLastAccessTime() { return this.lastAccessTime; }
    public void setLastAccessTime(LocalDateTime lastAccessTime) { this.lastAccessTime = lastAccessTime; }
    
    public String getLastAccessIp() { return this.lastAccessIp; }
    public void setLastAccessIp(String lastAccessIp) { this.lastAccessIp = lastAccessIp; }
    
    public String getDescription() { return this.description; }
    public void setDescription(String description) { this.description = description; }
    
    public Boolean getValid() { return this.valid; }
    public void setValid(Boolean valid) { this.valid = valid; }
    
    public Boolean getExpired() { return this.expired; }
    public void setExpired(Boolean expired) { this.expired = expired; }
    
    public Boolean getRequiresPassword() { return this.requiresPassword; }
    public void setRequiresPassword(Boolean requiresPassword) { this.requiresPassword = requiresPassword; }
    
    public Boolean getOneTimeLink() { return this.oneTimeLink; }
    public void setOneTimeLink(Boolean oneTimeLink) { this.oneTimeLink = oneTimeLink; }
    
    public Boolean getCanDownload() { return this.canDownload; }
    public void setCanDownload(Boolean canDownload) { this.canDownload = canDownload; }
    
    public Boolean getCanPreview() { return this.canPreview; }
    public void setCanPreview(Boolean canPreview) { this.canPreview = canPreview; }
    
    public Boolean getCanAccess() { return this.canAccess; }
    public void setCanAccess(Boolean canAccess) { this.canAccess = canAccess; }
    
    public Boolean getCanDownloadMore() { return this.canDownloadMore; }
    public void setCanDownloadMore(Boolean canDownloadMore) { this.canDownloadMore = canDownloadMore; }
    
    public LocalDateTime getCreateTime() { return this.createTime; }
    public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
    
    public LocalDateTime getUpdateTime() { return this.updateTime; }
    public void setUpdateTime(LocalDateTime updateTime) { this.updateTime = updateTime; }
}
